import {restartBlink} from "./selection.js"
import {webkit} from "../util/browser.js"
import {addClass, rmClass} from "../util/dom.js"
import {signal} from "../util/event.js"

export function ensureFocus(cm) {
    if (!cm.state.focused) {
        cm.display.input.focus();
        onFocus(cm)
    }
}

export function delayBlurEvent(cm) {
    cm.state.delayingBlurEvent = true
    setTimeout(() => {
        if (cm.state.delayingBlurEvent) {
            cm.state.delayingBlurEvent = false
            onBlur(cm)
        }
    }, 100)
}

export function onFocus(cm, e) {
    if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false

    if (cm.options.readOnly == "nocursor") return
    if (!cm.state.focused) {
        signal(cm, "focus", cm, e)
        cm.state.focused = true
        addClass(cm.display.wrapper, "CodeMirror-focused")
        // This test prevents this from firing when a context
        // menu is closed (since the input reset would kill the
        // select-all detection hack)
        if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
            cm.display.input.reset()
            if (webkit) setTimeout(() => cm.display.input.reset(true), 20) // Issue #1730
        }
        cm.display.input.receivedFocus()
    }
    restartBlink(cm)
}

export function onBlur(cm, e) {
    if (cm.state.delayingBlurEvent) return

    if (cm.state.focused) {
        signal(cm, "blur", cm, e)
        cm.state.focused = false
        rmClass(cm.display.wrapper, "CodeMirror-focused")
    }
    clearInterval(cm.display.blinker)
    setTimeout(() => {
        if (!cm.state.focused) cm.display.shift = false
    }, 150)
}
